package com.gylang.im.core.service;

import org.redisson.api.RLock;

import java.util.concurrent.TimeUnit;

/**
 * 分布式锁
 *
 * @author gylang,
 * date 2020/5/10,
 * @version 1.0
 */
public interface DistributedLocker {

    /**
     * 加锁
     *
     * @param lockKey 加锁
     * @return 锁
     */
    RLock lock(String lockKey);

    /**
     * 带超时的锁
     *
     * @param lockKey 加锁
     * @param timeout 过期时间 s
     * @return 锁
     */
    RLock lock(String lockKey, int timeout);

    /**
     * 带超时的锁
     *
     * @param lockKey 加锁
     * @param unit    过期时间
     * @param timeout 时间单位
     * @return 锁
     */
    RLock lock(String lockKey, TimeUnit unit, int timeout);

    /**
     * 尝试获取锁
     *
     * @param lockKey   锁名
     * @param waitTime  最多等待时间
     * @param leaseTime 上锁后自动释放锁时间
     * @param unit      时间单位
     * @return 获取成功标识
     */
    boolean tryLock(String lockKey, TimeUnit unit, int waitTime, int leaseTime);

    /**
     * 释放锁
     *
     * @param lockKey 锁名
     */
    void unlock(String lockKey);

    /**
     * 释放锁
     *
     * @param lock
     */
    void unlock(RLock lock);
}
